/**
 * 给定数组A，然后想象存在一个无穷数组，格式为AAAA...
 * 再给定数S。问在无穷数组中是否存在一个连续片段使得其和恰好等于S。
 * 先求出A的总和，然后用S对其取余数。
 * 然后再在AA中找是否有连续片段即可。
 * 求出AA的前缀和数组，记作SS。
 * 则对每个SSi只需要判断 SSi + S 是否存在于SS之中即可。二分。
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using Real = long double;
using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;
using pii = pair<int, int>;
using pll = pair<llt, llt>;
using i128 = __int128_t;

vll A, S;
int N;
llt Target;

void work(){
    cin >> N >> Target;
    A.assign(N + 1, 0);
    S.assign(N + N + 1, 0);
    for(int i=1;i<=N;++i){
        cin >> A[i];
        S[i] = S[i - 1] + A[i];
    }
    for(int i=1;i<=N;++i){
        S[i + N] = S[i + N - 1] + A[i];
    }

    llt left = Target % S[N];
    if(0 == left) return (void)(cout << "Yes" << endl);

    for(int i=1;i<=N+N;++i){
        llt t = S[i] + left;
        auto p = equal_range(S.begin(), S.end(), t);
        if(p.first != p.second){
            return (void)(cout << "Yes" << endl);
        }
    }
    cout << "No" << endl;
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
	// cin >> nofkase;
	while(nofkase--) work();
	return 0;
}